package principal;

import java.util.Random;
import principal.Janela;
import principal.Monitor;
import principal.Simulacao;

public class Pedestre extends Thread{
	private int velocidade;
	private int posicao;
	private int calcadaDeCima;
	private int calcadaDeBaixo;
	private int posicaoLateral;
	private static int faixaDePedestres;
	
	public Pedestre (int a) {
		velocidade = 0;
		posicao = 0;
		calcadaDeCima = 30;
		calcadaDeBaixo = 200;
		posicaoLateral = a;
		faixaDePedestres = 800;
		
	}
	
	public void run(){
		while(!Simulacao.getInstance().fimDaSimulacao()){
			aguardaTempoAleatorio(2000);
			atravessaSentidoIda();
			aguardaTempoAleatorio(2000);
			atravessaSentidoVolta();
		}
	}
	
	private void atravessaSentidoIda() {
		setPosicao(calcadaDeCima);
		escolheVelocidadeInicial();
		Janela.getInstance("Pedestres").desenhaPedestre(this);
		Monitor.getInstance().setTemPedestre(Monitor.getInstance().getTemPedestre() + 1);
		while(getPosicao() <= calcadaDeBaixo) {
			
			setPosicao(getPosicao() + getVelocidade());
			
			try {
				Thread.sleep(60);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			Janela.getInstance("Pedestres").desenhaPedestre(this);
		}
		Monitor.getInstance().setTemPedestre(Monitor.getInstance().getTemPedestre() - 1);
	}
	
	private void atravessaSentidoVolta() {
		setPosicao(calcadaDeBaixo);
		escolheVelocidadeInicial();
		Janela.getInstance("Pedestres").desenhaPedestre(this);
		Monitor.getInstance().setTemPedestre(Monitor.getInstance().getTemPedestre() + 1);
		while(getPosicao() >= calcadaDeCima) {
			
			setPosicao(getPosicao() - getVelocidade());
			
			try {
				Thread.sleep(60);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			Janela.getInstance("Pedestres").desenhaPedestre(this);
		}
		Monitor.getInstance().setTemPedestre(Monitor.getInstance().getTemPedestre() - 1);
	}

	private void escolheVelocidadeInicial() {
		int velocidade;
		velocidade = ((int) (geraNumeroAleatorio(3)) + 2);
		setVelocidade(velocidade);
	}

	private void aguardaTempoAleatorio(long intervalo) {
		int tempo;
		tempo = geraNumeroAleatorio((int)intervalo);
		tempo += 2000;

		try {
			Thread.sleep((long)tempo);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	private int geraNumeroAleatorio(int intervalo) {
		int numero;

		Random factor = new Random();
		numero = (int)(factor.nextDouble()*(intervalo + 1));
		return numero;
	}
	
	public int getVelocidade() {
		return velocidade;
	}

	public void setVelocidade(int velocidade) {
		this.velocidade = velocidade;
	}

	public int getPosicao() {
		return posicao;
	}

	public void setPosicao(int posicao) {
		this.posicao = posicao;
	}
	public int getPosicaoLateral() {
		return posicaoLateral;
	}
	 
	public static int getFaixaDePedestres() {
		return faixaDePedestres;
	}



}

